package com.ssb.plugins;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.apache.api.vo.ResultEntity;
import com.apache.cache.util.Validator;
import com.apache.ius.plugin.IusPluginUtil;
import com.apache.tools.*;
import com.ssb.util.AESUtil;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.*;

/**
 * 黄河接口对接-投保单接口
 */
@Component
public class HheInsurancePolicy extends HheSuperPlugin {

    @Override
    public Object beforeInvoke(Map<String, Object> map) {

        //校验此前端系统是否存在且有效
        String frontSysCode = StrUtil.doNull(String.valueOf(map.get("frontSysCode")));
        Map<String, String> result = new HashMap<String, String>();
        //1、校验 frontSysCode 是否为空
        if (Validator.isNull(frontSysCode)){
            result.put("errorCode", "F");
            result.put("errorMsg", "前端系统代码不能为空!");
			return  result;
        }
        Map selectFrontMap = new HashMap();
        selectFrontMap.put("ssFrontSystem.w_infoId",frontSysCode);
        ResultEntity obj = IusPluginUtil.getInstance().select("ssb", "obj", "s_ssFrontSystem", selectFrontMap);
        if (obj == null || obj.getEntity() == null){
            result.put("errorCode", "F");
            result.put("errorMsg", "没有该前端系统的信息，请确认后再继续操作！");
			return  result;
        }
        DataMap frontMap = (DataMap)obj.getEntity();
        String frontStatus = String.valueOf(frontMap.get("frontStatus"));
        if (frontStatus.equals("0")){
            result.put("errorCode", "F");
            result.put("errorMsg", "该前端系统无效，请确认后再继续操作！");
            return  result;
        }

        customMethod(map);
        if(!Validator.isEmpty(map.get("resultData"))) {
            JSONObject json = (JSONObject)map.get("resultData");
            if("0000".equals(json.getString("resposecode"))) {
                try {
                    Map<String, String> param = getParameterMapByJson(map);
                    return param;
                } catch (IOException e) {
            }
            }
        }
        return null;
    }

    @Override
    public Object afterInvoke(Map<String, Object> map) {
        return null;
    }

    private void customMethod(Map<String, Object> map){
        map.put("pageName","ss-insur-order");
        map.put("formName","addForm");
        map.put("ifBatch","T");
        map.put("ssInsurPerson.splitAttr","insuredName");
        map.put("ssInsurOrder.requesttype","10");
        map.put("ssInsurOrder.frontSysCode",String.valueOf(map.get("frontSysCode")));
        long startLong = System.currentTimeMillis();
        getProduct(map);
        Map<String, Object> param = new HashMap<>();
        String nowTime=DateUtils.Now.fmt_yyyyMMdd_HHmmss();
        map.put("ssInsurOrder.createTime", nowTime);
        String requestNo = Validator.generate();
        map.put("ssInsurOrder.requestNo",requestNo);
        param.put("channel_id",StrUtil.doNull(String.valueOf(map.get("ssInsurOrder.channelId")),"SSK"));//渠道编码，（默认：SSK）
        param.put("request_no",requestNo);//交易流水号（请求唯一标识码，该码不能重复）
        param.put("requesttype","10");//交易类型（10：投保单：30：退保；40：保单生成通知）
        param.put("product_id",map.get("ssInsurOrder.productId"));//保险公司产品代码，参考数据字典表产品代码
        param.put("timestamp",System.currentTimeMillis());//时间戳（毫秒数）
        param.put("amount",map.get("ssInsurOrder.amount"));//保额（保留两位小数）
        param.put("premium",map.get("ssInsurOrder.premium"));//保费（保留两位小数）
        param.put("insure_date",map.get("ssInsurOrder.insureDate"));//投保日期（YYYY-MM-DD HH:MM:SS）
        param.put("start_date",map.get("ssInsurOrder.startDate"));//起保日期（YYYY-MM-DD HH:MM:SS）
        param.put("end_date",map.get("ssInsurOrder.endDate"));//终保日期（YYYY-MM-DD HH:MM:SS）
        String applicantType = String.valueOf(map.get("ssInsurOrder.applicantType"));
        Map applicant = new HashMap();
        applicant.put("name",map.get("ssInsurOrder.applicantName"));//姓名
        applicant.put("sex",map.get("ssInsurOrder.applicantSex"));//性别（1：男；2：女）
        applicant.put("certi_type",map.get("ssInsurOrder.applicantCertiType"));//证件类型（01：居民身份证；02：护照；03：军人证；04：驾驶证；05：港澳台通行证；99：其他）企业证件类型（1-组织机构代码证，2-税务登记证，3-营业执照，4-社会统一信用代码，99-其他）
        applicant.put("certi_no",map.get("ssInsurOrder.applicantCertiNo"));//证件号
        applicant.put("phone",map.get("ssInsurOrder.applicantPhone"));//电话
        applicant.put("type",map.get("ssInsurOrder.applicantType"));//投保人类型（1：个人；2：企业）
        applicant.put("email",map.get("ssInsurOrder.applicantEmail"));//邮箱
        applicant.put("birthdate",String.valueOf(map.get("ssInsurOrder.applicantBirthdate")));//出生日期（YYYY-MM-DD）
        applicant.put("contactAdr", StrUtil.doNull(String.valueOf(map.get("ssInsurOrder.applicantContactAdr")), ""));//联系地址,为企业时可为空
        if("2".equals(applicantType)) {
            applicant.put("contactName", StrUtil.doNull(String.valueOf(map.get("ssInsurOrder.contactName")), ""));//联系人名称投保人类型为2：企业时必传
            applicant.put("officephonenumber", map.get("ssInsurOrder.officephonenumber"));//单位电话投保人类型为2：企业时必传
            applicant.put("companynature", StrUtil.doNull(String.valueOf(map.get("ssInsurOrder.companynature")), ""));//单位性质（详见码表）投保人类型为2：企业时必传 900
            applicant.put("numberofunits", StrUtil.doNull(String.valueOf(map.get("ssInsurOrder.numberofunits")), ""));//单位总人数必传
        }
        param.put("applicant",applicant);//投保人

        List<Map> insuredlist = new ArrayList<>();
        List<Map> person = (List)map.get("ssInsurPerson");
        for(int i=0;i<person.size();i++) {
            Map insured = new HashMap<>();
            Map<String,String> pem = person.get(i);
            pem.put("createTime", nowTime);
            insured.put("name", pem.get("insuredName"));//姓名
            if("01".equals(pem.get("insuredCertiType"))){
                Map<String,String> mm = AESUtil.getCarInfo(String.valueOf(map.get("ssInsurOrder.applicantCertiNo")));
                pem.put("insuredSex", mm.get("sex"));
                if(StrUtil.isNotNull(mm.get("birthdate")))
                pem.put("insuredBirthdate",mm.get("birthdate"));
            }
            insured.put("sex", StrUtil.doNull(pem.get("insuredSex"),"1"));//性别（1：男；2：女）
            insured.put("certi_type", pem.get("insuredCertiType"));//证件类型（01：居民身份证；02：护照；03：军人证；04：驾驶证；05：港澳台通行证；99：其他）企业证件类型（1-组织机构代码证，2-税务登记证，3-营业执照，4-社会统一信用代码，99-其他）
            insured.put("certi_no", pem.get("insuredCertiNo"));//证件号
            insured.put("type", pem.get("insuredType"));//被保人类型（1：个人；2：企业）
            insured.put("phone", pem.get("insuredPhone"));//
            if(StrUtil.isNull(pem.get("insuredRelation"))){
                if(pem.get("insuredCertiNo").equals(String.valueOf(map.get("ssInsurOrder.applicantCertiNo")))){
                    insured.put("relation", "0");
                    pem.put("insuredRelation","0");
                }
            }else {
                insured.put("relation", StrUtil.doNull(pem.get("insuredRelation"), "14"));//与投保人关系,完善代码(0-本人，1-配偶，2-子女，12-亲属，13-父母，14-其他)
            }
            insured.put("email", StrUtil.doNull(pem.get("insuredEmail"),""));//邮箱
            insured.put("birthdate", StrUtil.doNull(pem.get("insuredBirthdate"),""));//出生日期（YYYY-MM-DD）
            insured.put("contactAdr", StrUtil.doNull(pem.get("insuredContactAdr"),""));//联系地址
            if("2".equals(String.valueOf(pem.get("insuredType")))) {
                insured.put("ontheJobstatus", StrUtil.doNull(pem.get("ontheJobstatus"), ""));//在职状态(01:在职；02：退休；09：其他)有则提供，没有则默认其他
                insured.put("officenumber", StrUtil.doNull(pem.get("officeNumber"), ""));//单位电话（默认传：1111-1111111）
                insured.put("contactname", StrUtil.doNull(pem.get("contactName"), ""));//联系人（默认传“—”）
            }
            pem.put("insuredLevel","_");
            pem.put("insuredServerage","_");
            insuredlist.add(insured);
        }
        param.put("insuredlist",insuredlist);//被保人列表

        List<Map> dynamicis = (List)map.get("dynamici");
        List<Map> dynamiciList = new ArrayList<>();
        if(null != dynamicis) {//人员清单
            for(int i=0;i<dynamicis.size();i++) {
                Map dyn = dynamicis.get(i);
                Map dynamici = new HashMap<>();
                dynamici.put("name", dyn.get("insuredName"));//家政服务人员姓名
                dynamici.put("certi_no", dyn.get("insuredCertiNo"));//身份证号
                dynamici.put("level", StrUtil.doNull(String.valueOf(dyn.get("insuredLevel")),"1"));//家政服务员等级
                dynamici.put("serverage", StrUtil.doNull(String.valueOf(dyn.get("insuredServerage")),"1"));//从事家政服务年限
                dyn.put("insuredCertiType", "01");//证件类型（01：居民身份证；02：护照；03：军人证；04：驾驶证；05：港澳台通行证；99：其他）企业证件类型（1-组织机构代码证，2-税务登记证，3-营业执照，4-社会统一信用代码，99-其他）
                dyn.put("createTime", nowTime);
                dyn.put("insuredSex", "_");//性别（1：男；2：女）
                dyn.put("insuredType", "_");//被保人类型（1：个人；2：企业）
                dyn.put("insuredPhone", "_");//
                dyn.put("insuredRelation", "_");//与投保人关系,完善代码(0-本人，1-配偶，2-子女，12-亲属，13-父母，14-其他)
                dyn.put("insuredEmail","_");//邮箱
                dyn.put("insuredBirthdate", "_");//出生日期（YYYY-MM-DD）
                dyn.put("insuredContactAdr", "_");//联系地址
                dyn.put("ontheJobstatus", "_");//在职状态(01:在职；02：退休；09：其他)有则提供，没有则默认其他
                dyn.put("officeNumber", "_");//单位电话（默认传：1111-1111111）
                dyn.put("contactName", "_");//联系人（默认传“—”）
                dynamiciList.add(dynamici);
                person.add(dyn);
            }
            map.remove("dynamici");
        }
        param.put("dynamiciList",dynamiciList);//人员清单
        if(null !=map.get("ssInsurOrder.extendParams")) {
            param.put("extend_params", map.get("ssInsurOrder.extendParams"));//扩展信息
        }else{
            param.put("extend_params", new JSONObject());//扩展信息
        }
        if(null !=map.get("ssInsurOrder.proInfo")) {
            param.put("insurance_list", map.get("ssInsurOrder.proInfo"));//标的信息
        }else{
            JSONArray aa = new JSONArray();
            JSONObject jb = new JSONObject();
            jb.put("occupationType","1701");
            jb.put("occupationCode","1701003");
            jb.put("occupationLevel","2");
            aa.add(jb);
            param.put("insurance_list", aa);//标的信息
        }

        String str = String.valueOf(sendInterface("Externalcommon/proEntranceSSK", param,null));
        log.info("投保结果："+str);
        if(Validator.isNotNull(str)){//处理接口返回结果
            JSONObject json = JSON.parseObject(str);
            if("0000".equals(json.getString("resposecode"))){
                JSONArray array = json.getJSONArray("proposalnolist");//多条
                JSONObject obj = array.getJSONObject(0);
                map.put("ssInsurOrder.requestNo",obj.getString("proposalno"));
                map.put("ssInsurOrder.orderStatus","1");
                String userId = String.valueOf(map.get("ssInsurOrder.orgId"));
                if(StrUtil.isNotNull(userId) && !"0".equals(userId)) {//添加渠道商信息
                    Map user = getUser(userId);
                    map.put("ssInsurOrder.sellerEname", user.get("userEname"));
                    map.put("ssInsurOrder.sellerCname", user.get("userCname"));
                    map.put("ssInsurOrder.frontSysCode",String.valueOf(map.get("frontSysCode")));
                }
                if(!Validator.isEmpty(person)) {//被保人
                    for (int i = 0; i < person.size(); i++) {
                        Map pem = person.get(i);
                        pem.put("requestNo", obj.getString("proposalno"));
                    }
                }
            }
            map.put("resultData",json);
        }
        log.info("huanghe interface exetime = "+(System.currentTimeMillis()-startLong)+" ms");
    }

    private Map getUser(String userId){
        String sql = "select user_cname, user_ename from uct_user where user_id='"+userId+"'";
        List list = (List)IusPluginUtil.getInstance().select("plateform", sql,0,0);
        if(!Validator.isEmpty(list)){
            return (Map) list.get(0);
        }
        return new HashMap(1);
    }

    private void getProduct(Map<String, Object> map){
        String proId = String.valueOf(map.get("ssInsurOrder.proId"));
        String productId = String.valueOf(map.get("ssInsurOrder.productId"));
        if(StrUtil.isNull(productId)) {
            String sql = "select info_id,pro_code,agent_risk_cname,amount,premium,risk_code from ss_insur_pro where info_id='" + proId + "'";
            Map pro = selectInfo(sql, DATA_SOURCE);
            if (null != pro) {
                map.put("ssInsurOrder.proCode", pro.get("proCode"));
                map.put("ssInsurOrder.agentRiskCname", pro.get("agentRiskCname"));
                //map.put("ssInsurOrder.amount",pro.get("amount"));
                //map.put("ssInsurOrder.premium",pro.get("premium"));
                map.put("ssInsurOrder.productId", pro.get("riskCode"));
            }
        }
        String type = String.valueOf(map.get("ssInsurOrder.applicantCertiType"));
        if("01".equals(type)){
            Map<String,String> mm = AESUtil.getCarInfo(String.valueOf(map.get("ssInsurOrder.applicantCertiNo")));
            map.put("ssInsurOrder.applicantSex", mm.get("sex"));
            if(StrUtil.isNotNull(mm.get("birthdate")))
            map.put("ssInsurOrder.applicantBirthdate",mm.get("birthdate"));
        }
    }

    private Map<String, String> getParameterMapByJson(Map<String, Object> requestBody) throws IOException {
        Map<String, String> paramMap = new HashMap();
        paramMap.put("sysPass", ConfigUtil.getInstance().interfacePass());
        Set keSet = requestBody.entrySet();
        Iterator itr = keSet.iterator();
        while(true) {
            while(itr.hasNext()) {
                Map.Entry me = (Map.Entry)itr.next();
                String key = String.valueOf(me.getKey());
                Object ov = me.getValue();
                String value = "";
                String key2;
                if (ov instanceof List) {
                    List list = (List)ov;
                    for(int i = 0; i < list.size(); ++i) {
                        Map<String, String> objMap = (Map)list.get(i);
                        Set keSet2 = objMap.entrySet();
                        Iterator itr2 = keSet2.iterator();
                        while(itr2.hasNext()) {
                            Map.Entry me2 = (Map.Entry)itr2.next();
                            key2 = String.valueOf(me2.getKey());
                            Object value2 = me2.getValue();
                            String keys = key + "." + key2;
                            String values = "";
                            if (paramMap.containsKey(keys)) {
                                values = String.valueOf(paramMap.get(keys)) + "-#-";
                            }
                            values = values + String.valueOf(value2);
                            paramMap.put(keys, values);
                        }
                    }
                } else if (ov instanceof Map) {
                    Map<String, Object> reqMap = (Map)ov;
                    Set set2 = reqMap.entrySet();
                    Iterator itr2 = set2.iterator();

                    while(itr2.hasNext()) {
                        Map.Entry me2 = (Map.Entry)itr2.next();
                        key2 = String.valueOf(me2.getKey());
                        Object value2 = me2.getValue();
                        key2 = key + "." + key2;
                        String values = String.valueOf(value2);
                        paramMap.put(key2, values);
                    }
                } else {
                    value = String.valueOf(ov);
                    if (StrUtil.isNotNull(value)) {
                        String str = new String(value.getBytes("iso8859-1"), "iso8859-1");
                        if (value.equals(str)) {
                            value = str;
                        }
                        paramMap.put(key, value);
                    } else if (key.indexOf("s_") != -1) {
                        paramMap.put(key, "is null");
                    }
                }
            }
            return paramMap;
        }
    }
}
